package com.leenmvc.core.utils.logger;

import com.leenmvc.core.enums.LogType;
import com.leenmvc.core.utils.DateUtils;
import com.leenmvc.core.utils.dictionary.Dict;

import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;

public class LogFactory {

    // 全局Log的名称
    public static final String LOG_NAME = "Global";

    // 这个文件路径必须存在，不存在会报错，并不会自动创建
    public static final String LOG_FOLDER = System.getProperty("user.dir") + "/logs";

    // log文件路径
    private static String log_filepath;

    /**
     * 日志文件
     */
    private static File logFile;

    /**
     * 这是当前日志文件名产生依据的 精确到时的时间戳
     */
    private static Long lastDate;
    /**
     * 这个小时内产生了多少个日志文件
     */
    private static int logNum = 1;

    // 静态变量globleLog
    private static Logger globalLog;

    static {
        lastDate = DateUtils.getHourStart(System.currentTimeMillis());
        File file = new File(LOG_FOLDER);
        if (!file.exists()) {
            file.mkdirs();
        }
        // 加载类的时候初始化log文件全路径，这里的文件名称是JDKLog_+时间戳+.log
        log_filepath = LOG_FOLDER + File.separator + "JDKLog_" + LogUtil.getCurrentDateStr(LogUtil.DATE_PATTERN_NOMARK) + ".log";
        logFile = new File(log_filepath);
    }

    /**
     * 初始化全局Logger
     *
     * @return
     */
    public static Logger initGlobalLog() {
//
//        CacheFactory.put(CacheType.GLOBAL_VARIABLE, "LOG_ON", Dict.typeNameGet("SYSTEM", "LOG_ON"));
//        CacheFactory.put(CacheType.GLOBAL_VARIABLE, "LOG_INFO", Dict.typeNameGet("SYSTEM", "LOG_INFO"));
//        CacheFactory.put(CacheType.GLOBAL_VARIABLE, "LOG_SQL", Dict.typeNameGet("SYSTEM", "LOG_SQL"));
//        CacheFactory.put(CacheType.GLOBAL_VARIABLE, "LOG_WRAPPER", Dict.typeNameGet("SYSTEM", "LOG_WRAPPER"));

        // 获取Log
        Logger log = Logger.getLogger(LOG_NAME);

        // 为log设置全局等级
        log.setLevel(Level.ALL);

        // 添加控制台handler
        LogUtil.addConsoleHandler(log, Level.INFO);

        // 添加文件输出handler
        LogUtil.addFileHandler(log, Level.INFO, log_filepath);

        // 设置不适用父类的handlers，这样不会在控制台重复输出信息
        log.setUseParentHandlers(false);

        return log;
    }

    public static boolean logReadly() {
        return globalLog != null;
    }

    /**
     * 获取日志，每个日志的大小不超过10M 方便查看
     * <p>
     * 每小时生成一个日志文件，另每个文件的大小不超过10M
     *
     * @return
     */
    public static Logger getGlobalLog() {
        if (globalLog == null) {
            globalLog = initGlobalLog();
        }
        return globalLog;
    }

    /**
     * 打印日志
     *
     * @param level
     * @param message
     */
    public static void log(Level level, String message) {
        log(level, message, LogType.MESSAGE);
    }

    /**
     * 打印日志
     *
     * @param level
     * @param message
     */
    public static void log(Level level, String message, LogType type) {
        if (globalLog == null) return;

        // 是否开启日志
        if(!Dict.bool("SYSTEM", "LOG_ON")) return ;

        // 普通信息是否不记录
        if(!Dict.bool("SYSTEM", "LOG_INFO") && level.intValue() == 800) return;

        // 是否打印SQL
        if(!Dict.bool("SYSTEM", "LOG_SQL") && LogType.SQL.equals(type)) return;

        // 是否打印wrapper
        if(!Dict.bool("SYSTEM", "LOG_WRAPPER") && LogType.WRAPPER.equals(type)) return;
        switch (level.intValue()) {
            case 900:
                LogFactory.getGlobalLog().warning(message);

                break;
            case 800:
                LogFactory.getGlobalLog().info(message);
                break;
            case 700:
                LogFactory.getGlobalLog().config(message);
                break;
            case 500:
                LogFactory.getGlobalLog().fine(message);
                break;
            case 400:
                LogFactory.getGlobalLog().finer(message);
                break;
            case 300:
                LogFactory.getGlobalLog().finest(message);
                break;
            default:
        }
    }

}